home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DS-CD ROM 2 1993 August
/
DS CD-ROM 2.Ausgabe (August 1993).iso
/
programm
/
ds0257
/
demo.exe
/
TEXTIO.DEM
< prev
Wrap
Text File
|
1992-02-22
|
11KB
|
385 lines
; ----------------------------
; TEXTIO.DEM - Demoprogramm für die Routinen aus TEXTIO.LIB
; (für den A86)
;
; (c) Bernd Schemmer 1990 - 1992
; Letzter Update: 22.02.1992
;
; Übersetzen:
; A86 TEXTIO.DEM DEMOS.INC TO TEXTIO.COM
;
; Hinweis: Die Environment-Variable 'A86' muß den Dateinamen 'MACROS.MAC'
; enthalten und die .LIB-Dateien müssen über die Datei A86.LIB
; erreichbar sein.
;
; ---------------------------
jmp start ; Daten überspringen
logo db CR,LF
db 'TEXTIO.DEM - Demoprogramm für die Routinen aus TEXTIO.LIB'
db CR,LF
db '----------------------------------------------------------'
db CR,LF
db 'ACHTUNG: Dieses Demo erstellt die Dateien TEST.IN und TEST.OUT'
db CR,LF
db ' im aktuellen Directory (bestehende Dateien werden überschrieben!)'
db CR,LF
db CR,LF
db 'Bitte eine Taste drücken (ESC für Programm-Ende) ...'
db CR,LF
GETLENGTH logo
; ----------------------------
; Meldungen
;
MakeMsg CreateMSG1, 'Erstelle die Datei TEST.IN'
MakeMsg CreateMSG2, 'Erstelle die Datei TEST.OUT'
MakeMsg WriteMSG1, 'Schreibe die Datei TEST.IN (500 Zeilen)'
MakeMsg CloseMSG1, 'Schliesse die Datei TEST.IN'
MakeMsg AppendMSG1, 'Verlängere die Datei TEST.IN (500 Zeilen)'
MakeMsg OpenMSG1, 'Öffne die Datei TEST.IN zum Lesen'
MakeMsg KonvertMSG1,'Konvertiere die Datei TEST.IN und schreibe die Datei TEST.OUT'
MakeMsg CloseMSG2, 'Schliesse die Datei TEST.OUT'
; ----------------------------
; Fehlermeldungen
;
MakeMsg MemoryError, CR,LF, 'Fehler: Zuwenig freier Speicher'
MakeMsg CreateError1, CR,LF, 'Fehler beim Erstellen der Datei TEST.IN'
MakeMsg CreateError2, CR,LF, 'Fehler beim Erstellen der Datei TEST.OUT'
MakeMsg WriteError1, CR,LF, 'Fehler beim Schreiben der Datei TEST.IN'
MakeMsg WriteError2, CR,LF, 'Fehler beim Schreiben der Datei TEST.OUT'
MakeMsg ReadError1, CR,LF, 'Fehler beim Lesen der Datei TEST.IN'
MakeMsg OpenError1, CR,LF, 'Fehler beim Öffnen der Datei TEST.IN'
MakeMsg AppendError1, CR,LF, 'Fehler bein Verlängern der Datei TEST.IN'
MakeMsg CloseError1, CR,LF, 'Fehler beim Schliessen der Datei TEST.IN'
MakeMsg CloseError2, CR,LF, 'Fehler beim Schliessen der Datei TEST.OUT'
; ----------------------------
; Variablen
;
DefString zeile,255 ; Zeile zum Lesen u. Schreiben der Datei
; Datei-Tabelle zum Bearbeiten der Datei TEST.IN
;
InputBufferT dw
dw ? ; Handle
InputLen dw ? ; Größe des Puffers
dw ? ; Zeiger
dw ? ; Ende
InputOfs dw ? ; Offset des Puffers
InputSeg dw ? ; Segment des Puffers
InputStat db 0FFh ; Status (0FFh = geschlossen)
InputName db 7 ; Länge des Namens
db 'TEST.IN' ; Name der Datei
db 41h-7 dup 0
; Datei-Tabelle zum Schreiben einer Datei
;
OutputBufferT dw
dw ? ; Handle
OutputLen dw ? ; Größe des Puffers
dw ? ; Zeiger
dw ? ; Ende
OutputOfs dw ? ; Offset des Puffers
OutputSeg dw ? ; Segment des Puffers
OutputStat db 0FFh ; Status (0FFh = geschlossen)
OutputName db 8 ; Länge des Namens
db 'TEST.OUT' ; Name der Datei
db 41h-8 dup 0
; ----------------------------
start:
call ShowLogoAndAsk
; Speicher für die Puffer allokieren
mov bx,2000h
mov ah,048h
int 021h
jnc >l1
; 2 Segmente kriegen wir nicht, nehmen wir was
mov ah,048h ; wir kriegen können
int 021h
jc >l2
; min. 512 Byte pro Puffer sollten es aber schon
; sein
cmp bx,(512xD*2)/16xD
jae >l1
l2:
WRITE_STRING MemoryError
mov ax,0FFh
jmp Ende
l1:
; Dateitabelle korrigieren
shr bx,1 ; BX = Größe eines Puffers in Paragraphen
mov InputSeg,ax
add ax,bx
mov OutputSeg,ax
shl bx,1
shl bx,1
shl bx,1
shl bx,1
or bx,bx
if z mov bx,0FFFFh
; BX = Größe eines Puffers in Byte
mov InputOfs,0
mov OutputOfs,0
mov InputLen,bx
mov OutputLen,bx
WRITE_STRING CreateMSG1
; Testdatei erstellen
mov bx,offset InputBufferT
mov al,1 ; Code = Schreiben
call CreateFileBuffered
jnc >l1
; Fehler beim Erstellen
WRITE_STRING createError1
jmp Ende
l1:
WRITE_STRING WriteMSG1
; 500 Zeilen in die Datei schreiben
mov cx,500xD
mov bx,offset InputBufferT
mov si,offset zeile
l0:
push cx
call ErstelleZeile
call WriteLnFileBuffered
pop cx
jc >l1
push dx
mov dl,'.' ; 'Laufzeit'-Anzeige
mov ah,02h
int 021h
pop dx
loop l0
jmp >l2
l1:
; Fehler beim Schreiben
WRITE_STRING WriteError1
jmp CloseFile1 ; Datei trotzdem schliessen!
l2:
call ShowCR_LF
; Datei schliessen
WRITE_STRING CloseMSG1
call CloseFileBuffered
jnc >l1
; Fehler beim Schliessen der Datei
WRITE_STRING CloseError1
jmp Ende
l1:
; Datei verlängern um 500 Zeilen
WRITE_STRING AppendMSG1
call AppendFileBuffered
jnc >l1
; Fehler beim Eröffnen der Datei zum Verlängern
WRITE_STRING AppendError1
jmp Ende
l1:
; 500 weitere Zeilen in die Datei schreiben
WRITE_STRING WriteMSG1
mov cx,500xD
mov bx,offset InputBufferT
mov si,offset zeile
l0:
push cx
call ErstelleZeile
call WritelnFileBuffered
pop cx
jc >l1
push dx
mov dl,'.' ; 'Laufzeit'-Anzeige
mov ah,02h
int 021h
pop dx
loop l0
jmp >l2
l1:
; Fehler beim Schreiben
WRITE_STRING WriteError1
jmp CloseFile1 ; Datei trotzdem schliessen!
l2:
call ShowCR_LF
; Datei schliessen
WRITE_STRING CloseMSG1
call CloseFileBuffered
jnc >l1
; Fehler beim Schliessen der Datei
WRITE_STRING CloseError1
jmp Ende
l1:
; Datei öffnen zum Lesen
WRITE_STRING OpenMSG1
call ResetFileBuffered
jnc >l1
; Fehler beim Öffnen
WRITE_STRING OpenError1
jmp ende
l1:
; zweite Datei erstellen
WRITE_STRING CreateMSG2
mov bx,offset OutputBufferT
mov al,1 ; Code = Schreiben
call CreateFileBuffered
jnc >l1
; Fehler beim Erstellen der Datei
WRITE_STRING CreateError2
jmp CloseFile1 ; Input-Datei schliessen
l1:
WRITE_STRING KonvertMSG1
mov si,offset Zeile
mov di,offset Zeile
mov cx,offset InputBufferT
mov dx,offset OutputBufferT
l00:
mov bx,cx ; BX zeigt auf die Tabelle der Datei TEST.IN
call ReadLnFileBuffered
jnc >l1
cmp ah,0FFh ; EOF ?
je CloseFile1_2
; Fehler beim Lesen
WRITE_STRING ReadError1
jmp CloseFile1_2
l1:
; Zeile bearbeiten
call KonvertiereZeile
push dx
mov dl,'.' ; 'Laufzeit'-Anzeige
mov ah,02h
int 021h
pop dx
mov bx,dx ; BX zeigt auf die Datei-Tabelle von TEST.OUT
call WritelnFileBuffered
jnc >l1
l10:
WRITE_STRING WriteError2
jmp CloseFile1_2 ; Input- und Output-Datei schliessen!
l1:
jmp l00 ; nächste Zeile
CloseFile1_2:
call ShowCR_LF
; Output-Datei schliessen
WRITE_STRING CloseMSG2
mov bx,offset OutputBufferT
call CLoseFileBuffered
jnc CloseFile1
; Fehler beim Schliessen
WRITE_STRING CloseError2
CloseFile1: ; Input-Datei schliessen
WRITE_STRING CloseMSG1
mov bx,offset InputBufferT
call CLoseFileBUffered
jnc Ende
; Fehler beim Schliessen
WRITE_STRING CloseError1
ENDE:
EndProcess
; ----------------------------
; KonvertiereZeile
;
; Funktion: Ersetzt alle Zeichen mit ASCII-Codes kleiner als 32 in
; der Zeile durch einen Punkt
;
KonvertiereZeile:
push di,si,cx
mov di,offset Zeile
lodsb
or al,al
jz >l9 ; Zeile ist leer
mov cl,al
xor ch,ch ; CX = Länge der Zeile
mov di,si
l0:
lodsb
cmp al,BLANK
if b mov al,'.'
stosb
loop l0
l9:
pop cx,si,di
ret
; ----------------------------
; ErstelleZeile
;
; Funktion: Erstellt eine Zeile mit (fast) zufälligen Werten für die Datei
;
ErstelleZeile:
push di,bx,cx,dx
mov di,offset zeile
xor al,al
mov [di],al ; Zeile erst einmal löschen
xor ah,ah ; 'zufällige' Zeilenlänge ermitteln
int 01Ah
mov cl,dl
shl cl,1
add cl,dl
xor ch,ch
or cx,cx
jz >l2
mov [di],cl ; Stringlänge eintragen
inc di
l0:
push cx
xor ah,ah
int 01Ah
cmp dl,CR ; KEINE Trennzeichen zulassen!
if e mov dl,4
cmp dl,LF
if e mov dl,4
cmp dl,CTRL_Z
if e mov dl,4
mov al,dl
stosb
pop cx
loop l0
l2:
pop dx,cx,bx,di
ret